有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何通过java graphics 2d将图片剪切成圆形?我希望结果与objectfit类似:css中的cover

我想用java graphics 2d将图片切割成圆形,但结果并不令人满意。我希望最终的图片与css中的“对象匹配:封面”类似

这是原图 original pic

下面是我的代码和最终结果

    BufferedImage testImage = ImageIO.read(new File("/Users/huangruixiang/Desktop/test.png"));
    BufferedImage formatAvatarImage = new BufferedImage(200, 200, BufferedImage.TYPE_4BYTE_ABGR);
    Graphics2D graphics = formatAvatarImage.createGraphics();
    graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, 200, 200);
    graphics.setClip(shape);
    graphics.drawImage(testImage, 0, 0, 200, 200, null);
    graphics.dispose();
    ImageIO.write(formatAvatarImage,"png",new File("/Users/huangruixiang/Desktop/circle.png"));

resule

我想要的效果与此类似 Expected effect


共 (1) 个答案

  1. # 1 楼答案

    给你

    enter image description here

    你必须使用与你使用的不同的drawImage方法

    下面是完整的可运行代码

    import java.awt.Dimension;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.geom.Ellipse2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    
    public class CenterCutImage {
    
        public static void main(String[] args) {
            CenterCutImage cci = new CenterCutImage();
            BufferedImage image = cci.readImage("/do3kO.png");
            BufferedImage croppedImage = cci.createCenterCut(image, new Dimension(200, 200));
            String path = "D:\\Eclipse\\Eclipse-2020-workspace\\com.ggl.testing3\\resources";
            cci.writeImage(croppedImage, path, "circle.png");
        }
    
        public BufferedImage createCenterCut(BufferedImage inputImage, Dimension d) {
            BufferedImage image = new BufferedImage(d.width, d.height, BufferedImage.TYPE_4BYTE_ABGR);
            Graphics2D g2d = (Graphics2D) image.getGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    
            int x = (inputImage.getWidth() - d.width) / 2;
            int y = (inputImage.getHeight() - d.height) / 2;
            Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, d.width, d.height);
            g2d.setClip(shape);
            g2d.drawImage(inputImage, 0, 0, d.width, d.height, x, y, x + d.width, y + d.height, null);
            g2d.dispose();
    
            return image;
        }
    
        public BufferedImage readImage(String filename) {
            try {
                return ImageIO.read(getClass().getResourceAsStream(filename));
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        public void writeImage(BufferedImage croppedImage, String path, String filename) {
            try {
                ImageIO.write(croppedImage, "png", new File(path + "/" + filename));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }